10. 逻辑回归模型 (Logistic Regression)

您所在的位置:网站首页 logistic p值cutoff 10. 逻辑回归模型 (Logistic Regression)

10. 逻辑回归模型 (Logistic Regression)

2023-08-07 00:42| 来源: 网络整理| 查看: 265

1. 简介

逻辑回归模型需要选择predictor以及它们的具体形式,这其中包含了他们之间的关联项,这一点也保证了逻辑回归在偏小的数据集上面也能得到不错的结果。逻辑回归虽然名字中有回归,但实际上不能用于连续数值的预测,并且他还有一点好处在于一旦逻辑回归的模型建立起来之后,对于大量新数据的分类的计算都会变得十分快速且消耗的计算资源很少。逻辑回归的precditors可以是categorical的,也可以是numerical的,这一点上同multiple linear regression一致,只不过multiple linear regression是对连续的Y值进行预测,然而逻辑回归仅仅是把记录进行分类。逻辑回归的决策边缘是线性的,因此逻辑回归是线性模型。

2. 逻辑回归的功能

逻辑回归主要用于下列两种情况: a. 新数据的类别未知,需要根据其predictors将新数据的类别分到已知的类别中(分类问题) b. 数据的类别已知,需要知道能区分开这些类别的factor(profilling问题)

3. 逻辑回归的基本思路,模型

逻辑回归的基本思路 a. 首先获取各个类的propensities(属于该类的概率),比如Y=1的propensity就是p=P(Y=1) b. 然后设置cutoff value,并根据该值同propensities比较的结果,将新数据分类,比如若P(Y=1)0.5则分类为0,否则为1

逻辑回归的设计思路 从逻辑回归的设计目的开始,逻辑回归的设计主要是为了分类,multilinear regression model输出的是一个连续的预测值Y(其范围可能是(-\inf , +\inf)),那这个预测值Y要如何同分类问题结合起来?因此,聪明的data scientist想到了logit这个函数,logit函数的特点是它可以被mapped back to a probability,当我们拿到了属于各个类的probability(其范围是[0,1]),我们就能够做出分类问题的模型了。 根据这个设计思路,逻辑回归模型的公式如下: logit = \beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d p = \frac{1}{1+e^{-logit}}=\frac{1}{1+e^{-(\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d)}}

propensity, logit, odds的公式,图像,关系,取值范围 据上面所写,我们对下列函数进行定义和分析:

logit函数 a) 定义 logit = \beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d b) 取值范围 从公式上可以看出,logit函数是predictor的线性叠加,因此范围是(-\inf , +\inf) c) 图像 logit函数同probability的关系是: p = \frac{1}{1+e^{-logit}} 其图像为:

图1 logit函数

odds函数 a) 定义 之所以要把odds这个函数单独拿出来说,是因为odds具有具体的现实含义,odds的定义是属于该class的概率比上属于其他class的概率 odds=\frac{p}{1-p} 将odds中的p用logit函数迭代,可以得到: odds=e^{\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d} 因此: log(odds)=logit=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d b) 取值范围 显而易见,odds的取值范围是(0, +\inf) c) 图像 根据上面分析:

图2 odds函数

sigmoid函数 由logit函数之中,我们看到p=\frac{1}{1+e^{-logit}} 因此,sigmoid function定义为f(x)=\frac{1}{1+e^{-x}},这也正是神经网络在最后为何选用sigmoid作为激活函数的原因,即将各个神经元之间的权重和进行sigmoid函数,转换成对应class的概率,从而激活输出层的神经元以进行分类。 神经网络中由于反向传播算法更新权重,常常需要进行求导操作,对于sigmoid function来说 f'(x)= (\frac{1}{1+e^{-x}} )'=\frac{ e^{-x}}{(1+e^{-x})^2} =\frac{1}{1+e^{-x}}*\frac{(1+e^{-x})-1}{1+e^{-x}}=f(x)(1-f(x))

总结 a) odds = \frac{p}{1-p}, p=\frac{odds}{1+odds} b) logit = log(odds), p=\frac{e^{logit}}{1+e^{logit}}=\frac{1}{1+e^{-logit}} c) logit=ln(\frac{p}{1-p}) d) odds=e^{\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d} e) logit=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d f) p=\frac{1}{1+e^{-(\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_dx_d)}}

杂谈 a. 假如cutoff probability是0.5,则odds的cutoff是odds=\frac{p}{1-p}=1,logit的cutoff是logit=ln(\frac{p}{1-p})=0 b. 在处理数据的过程中,第一步便是拟合线性模型,拟合的过程中,可能需要对一些categorical的data进行dummy化,但是这一回,同multiple linear regression一样,选择drop掉一个dummy variable 比如,处理实际数据的时候,遇到了"Education Level"这个变量,其categories是String类型,可以用如下的python代码来创建dummy variable

# 将Education的数据类型转换成category bank_df['Education'] = bank_df['Education'].astype('category') # 建立新的字典,用于替换掉对应的数据 new_categories = {1: 'Undergrad', 2: 'Graduate', 3: 'Advanced/Professional'} # inplace=True即对原始数据集的数据列进行了替换 bank_df.Education.cat.rename_categories(new_categories, inplace=True) # prefix定义了创建dummy variable的命名格式,drop_first丢掉了一个dummy variable bank_df = pd.get_dummies(bank_df, prefix_sep='_', drop_first=True) 4. Profiling

正如之前所提到的,profiling的目的在于寻找能区分开这些类别的factor,这个时候,最适合拿来做分析的函数便是odds,因为odds定义了属于该类与属于其他类之间的比 如果对某一个变量x_1增加了1,那么 \frac{odds(x_1+1,x_2,...,x_d)}{odds(x_1,x_2,...,x_d)}=e^{\beta_1} 如果\beta_10,则上式的值小于1,代表了odds随x_1增大会减小,属于该类的概率会减小,反之属于该类的概率会增大,增大或者减小的强度由e^{\beta_1}的绝对值大小给出,代表了该predictor影响结果Y的能力 如果predictor是一个dummy variable,则解释会略有不同,这代表了这个predictor属于该category与否对结果的影响有多大。 需要注意的一点是,这个p并不是一个常数,因此profiling只限定于当前的数据集。如果新的记录添加进来,则可能需要重新profiling。

5. 逻辑回归的参数

逻辑回归的核心思想已经清晰了,但是最大的问题是逻辑回归如何求参(各个\beta的值)。逻辑回归里面,由之前的模型可知Y和\beta的关系是非线性的,因此不能像multilinear regression里面使用最小二乘(least square)的方式来求参。因此,逻辑回归选用maximum likelihood作为求参的依据,即寻找一个估计,能够最大可能性得到这条数据的结果,这个可以通过迭代的方式求出来。

Maximum Likelihood 令p(y|x)代表属于该类的概率,则y可能的值为0或者1,服从Bernouli分布 p(y|x)=\begin{cases} p^y \qquad\qquad for \ y=1 \\ (1-p)^{1-y} \quad for \ y=0 \end{cases} where \ p=\frac{1}{{1+e^{-\beta^Tx}}}

maximum likelihood转换成minimize cross-entropy loss 如下图所示,最大似然问题最终会转换成最小化cross-entropy loss问题

图3.1 最大似然问题的转化

对cross-entropy loss的分析

图3.2 分析

迭代法更新权重 迭代法的核心思想是先初始设置一个值,而后根据每一次迭代产生的loss function通过求出loss对权重的梯度来对原来设置的值进行更新

图3.3 parameter的更新规则

决策边缘 当得到了\beta的值了之后,如上面所述,当cutoff为0.5时,logit应该为0,也就是\mathbf{\beta}^T\mathbf{x}= 0,因此,其图像如下图所示:

图3.4 决策边缘 显然,这证明了logistic regression依旧是一个线性分类器

对于逻辑回归的参数更新方法的分析 最大似然的方法相比较multiple linear regression的最小二乘法的鲁棒性要低一些,由于他只是最大得到了似然概率,因此当数据集满足 a. 每个类都有大量的数据 b. 类的概率比值不能太靠近0或者1 c. 模型设定的时候,\beta的参数数量相对于sample size比较少的时候 逻辑回归的效果会比较高 在逻辑回归中,如果predictor之间的colinearity很大,会造成计算上的困难,这也是为什么在section 2的杂谈里面设置dummy variable的时候选择drop掉一个dummy的原因,因为多出来的dummy variable提供了redundant information(对于一个有m个种类的categorical vairable来说,m-1个dummy variable与m个dummy variable提供了同样的信息)

6. 逻辑回归的performance evaluation,model selection

a. 分类问题 分类问题的evaluation也适用于logistic regression,比如confusion matrix

b. ranking问题 ranking问题的目的是要找出特定满足class of interest的记录,比如某电影院的会员制度需要找到向哪些人推荐更容易让他们买下会员(注意这类问题可能会有分类错误导致的额外花费),则可以用cumulative gain chart和decile lift chart来分析,具体表格和图像的画法及说明参见本书的第5章(后续再补上)

c. 模型选择 逻辑回归的模型中有时候也要考虑进predictor中的interaction,比如可以用一个新的参数来refelect参数之间的关系,比如A factor和B factor之间可能有关联性,那么可以发展出新的参数A x B来反应他们的关系。但是总的而言,如果模型简单就有比较好的效果,那么还是简单模型依旧优于复杂模型。validation set的准确率也是模型选择中的主要参考指标。 同multiple linear regression一样,逻辑回归也可以用automatic variable selection的方法,比如stepwise, L1, L2 penalty,AIC,BIC等

#逻辑回归之中加入L2 penalty以自动选择variable LogisticRegression(penalty=“l2”, C=1e42) 7 逻辑回归与多分类问题

逻辑回归可以从二分类问题拓展到多分类问题,按照这种思路,假设有m个类,那么我们需要得到m-1个probability(这m个probability的加和是1) 多分类有两种情况,一种情况是分类是ordinal的,一种是nominal的

ordinal 这种情况下,比如股票市场的选择,可以是买,保持,卖,他们保持着顺序,这种情况下每一个类对于probability影响的效果是相同的,因此拟合出来的模型的系数(不包括截距)是一致的。 P(Y=1)=P(Y \leq 1) P(Y=2)=P(Y \leq 2)-P(Y \leq 1) P(Y=3)=1 - P(Y \leq 2) 可以看出上面的关系中,三个类的关系是一个叠加的关系 根据logit的定义,logit=log(odds),odds为该类与其他类的概率比 logit(buy)=log\frac{p(Y \leq 1)}{1-p(Y \leq 1)} logit(buy \ or \ hold)=log\frac{p(Y \leq 2)}{1-p(Y \leq 2)} 因此 logit(buy)=a_0+b_1x logit(buy \ or \ hold)=b_0+b_1x 因此 P(Y=1)=\frac{1}{e^{-({a_0+b_1x})}} P(Y=2)=P(Y \leq 2)-P(Y \leq 1)=\frac{1}{e^{-({b_0+b_1x})}}-\frac{1}{e^{-({a_0+b_1x})}} P(Y=3)=1-P(Y \leq 2)=1-\frac{1}{e^{-({b_0+b_1x})}}

Nominal Nominal class的特点是每一个类仅仅只是与另一个类不同,但并没有任何顺序,因此对不同的类别用不同的系数来拟合模型。 因为用m-1个类来模拟,因此将剩余的那一个类作为参考类,其他类对于这个类的比为: logit(A)=log\frac{P(Y=A)}{P(Y=C)} =a_0+a_1x logit(B)=log\frac{P(Y=B)}{P(Y=C)} =b_0+b_1x 因此: P(Y=A)=\frac{e^{{a_0+a_1x}}}{ 1+e^{{a_0+a_1x}}+ e^{{b_0+b_1x}}} P(Y=B)=\frac{e^{{b_0+b_1x}}}{ 1+e^{{a_0+a_1x}}+ e^{{b_0+b_1x}}} P(Y=C)=1-P(Y=A)-P(Y=B)=\frac{1}{ 1+e^{{a_0+a_1x}}+ e^{{b_0+b_1x}}}

python code

# nominal logit = LogisticRegression(penalty="l2", solver='lbfgs', C=1e24, multi_class='multinomial') logit.fit(X, y) print(' intercept', logit.intercept_) print(' coefficients', logit.coef_) # ordinal logit = LogisticIT(alpha=0) logit.fit(X, y) print(' theta', logit.theta_) print(' coefficients', logit.coef_)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3